package com.cy.sp06.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;


import javax.servlet.http.HttpServletRequest;

@Component  //将该过滤器交给spring容器管理
public class AccessFilter extends ZuulFilter {

    //设置过滤器的类型：pre前置过滤器、routing、post、error
    @Override
    public String filterType() {

        //pre前置过滤器
        //写法一：return "pre";
        return FilterConstants.PRE_TYPE;
    }

    //位置序号，定位自定义过滤器的位置
    @Override
    public int filterOrder() {

        //默认5个过滤器，自定义过滤器放到位置6
        //默认过滤器：过滤器5：serviceId:xxx(item-service) -> context
        //所以自定义过滤器必须放在第5个过滤器之后，否则无法从context中获得serviceId
        return 6;
    }

    //判断针对当前请求，是否执行过滤代码
    @Override
    public boolean shouldFilter() {
        /*
        * 测试过滤逻辑实现：
        * 1.调用商品判断权限
        * 2.调用用户和订单，不检查权限
        * */

        //通过上下文请求对象，获得调用的服务id
        RequestContext ctx = RequestContext.getCurrentContext();
        String serviceId = (String) ctx.get(FilterConstants.SERVICE_ID_KEY);

        //判断serviceId是否商品服务，返回true执行run方法进行权限判断，返回false则通过过滤
        return "item-service".equals(serviceId);
    }

    //过滤功能实现代码 -- 判断token是否为空
    @Override
    public Object run() throws ZuulException {

        //获取request对象
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        //接收token参数
        String token = request.getParameter("token");

        //没有token，阻止继续访问，直接返回响应
        //token为空的逻辑判断：if (token ==  null || token.length() == 0 || token.trim().length() == 0)
        //使用apache提供的字符串工具类进行判断为空
        if (StringUtils.isBlank(token)){
            //阻止继续访问
            ctx.setSendZuulResponse(false);
            //直接返回响应
            ctx.addZuulResponseHeader("Content-Type","text/html;charset=UTF-8");
            ctx.setResponseBody("Not Login! 未登录!");
        }
        //该返回值不起作用，返回任何数据都可以
        return null;
    }
}
